package com.example.casserver.model;

import lombok.Data;

import java.time.LocalDateTime;

/**
 * CAS服务票据（Service Ticket）模型
 * 用于在CAS服务器和客户端应用之间传递用户身份信息
 * 
 * 服务票据具有以下特点：
 * 1. 一次性使用：验证后立即失效，防止重放攻击
 * 2. 有效期短：默认5分钟，减少被盗用风险
 * 3. 绑定服务：只能用于指定的服务地址
 */
@Data
public class ServiceTicket {
    /**
     * 票据ID
     * 格式为："ST-" + UUID
     * 作为URL参数传递给客户端应用
     */
    private String id;

    /**
     * 用户名
     * 标识票据所属的用户
     */
    private String username;

    /**
     * 目标服务地址
     * 票据只能用于验证此地址的服务
     * 防止票据被用于非预期的服务
     */
    private String service;

    /**
     * 票据创建时间
     */
    private LocalDateTime createdAt;

    /**
     * 票据过期时间
     * 默认为创建时间后5分钟
     */
    private LocalDateTime expiresAt;

    /**
     * 票据使用状态
     * true: 已使用
     * false: 未使用
     */
    private boolean used;

    /**
     * 创建新的服务票据
     *
     * @param id 票据ID
     * @param username 用户名
     * @param service 目标服务地址
     */
    public ServiceTicket(String id, String username, String service) {
        this.id = id;
        this.username = username;
        this.service = service;
        this.createdAt = LocalDateTime.now();
        this.expiresAt = this.createdAt.plusMinutes(5);  // 5分钟有效期
        this.used = false;
    }

    /**
     * 检查票据是否已过期
     *
     * @return true: 已过期, false: 未过期
     */
    public boolean isExpired() {
        return LocalDateTime.now().isAfter(expiresAt);
    }

    /**
     * 检查票据是否有效
     * 有效的票据需要同时满足：未过期且未使用
     *
     * @return true: 有效, false: 无效
     */
    public boolean isValid() {
        return !isExpired() && !isUsed();
    }
} 